﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace CppIDE.Core
{

    /// <summary>
    /// Egy forrásfájlt reprezentáló absztrakt osztály.
    /// Implementációi: CppFile és HeaderFile.
    /// </summary>
    public abstract class SourceFile : File
    {

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt, elérési út nélkül.
        /// </summary>
        protected SourceFile()
            : base()
        {
        }

        /// <summary>
        /// Konstruktor, létrehoz egy új példányt, elérési úttal.
        /// </summary>
        /// <param name="fullPath">teljes elérési út</param>
        protected SourceFile(String fullPath)
            : base(fullPath)
        {
        }

        /// <summary>
        /// Létrehoz egy új forrásfájlt a megadott teljes elérési úthoz.
        /// </summary>
        /// <param name="fullPath">A teljes elérési út</param>
        /// <returns>HeaderFile vagy CppFile</returns>
        public static SourceFile factory(String fullPath)
        {
            bool header =
                fullPath.EndsWith(".h", StringComparison.OrdinalIgnoreCase) ||
                fullPath.EndsWith(".hpp", StringComparison.OrdinalIgnoreCase) ||
                fullPath.EndsWith(".hxx", StringComparison.OrdinalIgnoreCase);
            if (header)
            {
                return new HeaderFile(fullPath);
            }
            else
            {
                return new CppFile(fullPath);
            }
        }

        /// <summary>
        /// A fájl tartalma ezen keresztül közvetlen elérhető.
        /// Írható és olvasható is.
        /// </summary>
        /// <value>A fájl tartalma</value>
        [XmlIgnore]
        public String Content
        {
            get
            {
                String content;
                try
                {
                    TextReader reader = new StreamReader(FullPath);
                    content = reader.ReadToEnd();
                    reader.Close();
                }
                catch (Exception)
                {
                    content = "";
                }
                return content;
            }
            set
            {
                TextWriter writer = new StreamWriter(FullPath);
                writer.Write(value);
                writer.Close();
            }
        }

    }

}
